#ifndef ARCHIVOREPOSITORIOS_H_
#define ARCHIVOREPOSITORIOS_H_

#pragma once
#include <vector>
#include <algorithm>
#include <sstream>
#include <sys/stat.h>
#include <unistd.h>
#include <sys/types.h>
#include <pwd.h>
#include "Archivo.h"

using namespace std;

class ArchivoRepositorios: public Archivo {
private:
    unsigned int length;

public:
    ArchivoRepositorios(const char* filename):Archivo(filename) {
        this->clear();
        this->seekg(0, ios::end);
        this->length = this->tellg();

        this->clear();
        this->seekg(0, ios::beg);
    }

    bool add(string rep) {
        if (! isIndice(rep)) {
            unsigned char size = (unsigned char) rep.size();
            char* s = new char[rep.size() + 1];
            strcpy(s, rep.c_str());

            this->write((char*) &size, sizeof(unsigned char));
            this->write((char*) s, rep.size());

            this->length = (unsigned int) this->tellp();

            Archivo::indexDir=(string(baseDir).append(rep).append("/"));
            mkdir (Archivo::indexDir.c_str(), 0777);

            return true;
        }

        return false;
    }

    bool isIndice(string rep) {
        this->clear();
        this->seekg(0, ios::beg);

        while (true) {
            if ((unsigned int)this->tellg() == length)
                return false;

            unsigned char size;
            this->read((char*) &size, sizeof(unsigned char));

            char* buf = new char[size + 1];
            this->read((char*) buf, size);

            buf[size] = '\0';
            string str = string(buf);
            delete []buf;

            if (str.compare(rep) == 0)
                return true;
        }
    }

    ~ArchivoRepositorios() {
        this->close();
    }

    string baseDir;
};

#endif /* ARCHIVOREPOSITORIOS_H_ */
